﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UtilZ.Dotnet.Ex.Attributes;
using UtilZ.Dotnet.Ex.ValueDescription;

namespace UtilZ.Dotnet.Ex.Communication.Net.Web
{
    /// <summary>
    /// Http请求头
    /// </summary>
    public class HttpRequestHeaders
    {
        private readonly static ValueDescriptionGroup<string> _group = null;
        static HttpRequestHeaders()
        {
            _group = new ValueDescriptionGroup<string>(typeof(HttpRequestHeaders), "Http请求头");
        }


        /// <summary>
        /// 获取http请求头名称
        /// </summary>
        /// <param name="headName">http请求头</param>
        /// <returns>http请求头名称</returns>
        public static string GetStatusCodeName(string headName)
        {
            if (headName is null)
            {
                throw new ArgumentNullException(nameof(headName));
            }

            string name;
            if (_group.TryGetNameByValue(headName, out name))
            {
                return name;
            }
            else
            {
                return $"未知的http请求头\"{headName}\"";
            }
        }

        /// <summary>
        /// 获取http请求头描述
        /// </summary>
        /// <param name="headName">http请求头</param>
        /// <returns>http请求头描述</returns>
        public static string GetStatusCodeDes(string headName)
        {
            if (headName is null)
            {
                throw new ArgumentNullException(nameof(headName));
            }

            string des;
            if (_group.TryGetDescriptionByValue(headName, out des))
            {
                return des;
            }
            else
            {
                return $"未知的http响应头\"{headName}\"";
            }
        }










        /// <summary>
        /// Cache-Control，指定请求/响应链上所有缓存控制机制必须服从的指令。
        /// </summary>
        [DisplayNameEx("指定请求/响应链上所有缓存控制机制必须服从的指令")]
        public const string CacheControl = "Cache-Control";

        /// <summary>
        /// Connection，指定特定连接需要的选项。
        /// </summary>
        [DisplayNameEx("指定特定连接需要的选项")]
        public const string Connection = "Connection";

        /// <summary>
        /// Date，指定开始创建请求的日期和时间。
        /// </summary>
        [DisplayNameEx("指定开始创建请求的日期和时间")]
        public const string Date = "Date";

        /// <summary>
        /// Keep-Alive，指定用以维护持久性连接的参数。
        /// </summary>
        [DisplayNameEx("指定用以维护持久性连接的参数")]
        public const string KeepAlive = "Keep-Alive";

        /// <summary>
        /// Pragma，指定可应用于请求/响应链上的任何代理的特定于实现的指令。
        /// </summary>
        [DisplayNameEx("指定可应用于请求/响应链上的任何代理的特定于实现的指令")]
        public const string Pragma = "Pragma";

        /// <summary>
        /// Trailer，指定标头字段显示在以 chunked 传输编码方式编码的消息的尾部。
        /// </summary>
        [DisplayNameEx("指定标头字段显示在以 chunked 传输编码方式编码的消息的尾部")]
        public const string Trailer = "Trailer";

        /// <summary>
        /// Transfer-Encoding，指定对消息正文应用的转换的类型（如果有）。
        /// </summary>
        [DisplayNameEx("指定对消息正文应用的转换的类型（如果有）")]
        public const string TransferEncoding = "Transfer-Encoding";




        /// <summary>
        /// 要升级到的Websocket协议
        /// </summary>
        [DisplayNameEx("要升级到的Websocket协议")]
        public const string Upgrade = "Upgrade";

        /// <summary>
        /// 支持的协议扩展
        /// </summary>
        [DisplayNameEx("支持的协议扩展")]
        public const string SecWebSocketExtensions = "Sec-WebSocket-Extensions";

        /// <summary>
        /// 验证KEY
        /// </summary>
        [DisplayNameEx("验证KEY")]
        public const string SecWebSocketKey = "Sec-WebSocket-Key";

        /// <summary>
        /// 客户端支持的版本号
        /// </summary>
        [DisplayNameEx("客户端支持的版本号")]
        public const string SecWebSocketVersion = "Sec-WebSocket-Version";


        /// <summary>
        /// Via，指定网关和代理程序要使用的中间协议。
        /// </summary>
        [DisplayNameEx("指定网关和代理程序要使用的中间协议")]
        public const string Via = "Via";

        /// <summary>
        /// Warning，指定关于可能未在消息中反映的消息的状态或转换的附加信息。
        /// </summary>
        [DisplayNameEx("指定关于可能未在消息中反映的消息的状态或转换的附加信息")]
        public const string Warning = "Warning";

        /// <summary>
        /// Allow，指定支持的 HTTP 方法集。
        /// </summary>
        [DisplayNameEx("指定支持的 HTTP 方法集")]
        public const string Allow = "Allow";

        /// <summary>
        /// Content-Length，指定伴随正文数据的长度（以字节为单位）。
        /// </summary>
        [DisplayNameEx("指定伴随正文数据的长度（以字节为单位）")]
        public const string ContentLength = "Content-Length";

        /// <summary>
        /// Content-Type，指定伴随正文数据的MIME类型。
        /// </summary>
        [DisplayNameEx("指定伴随正文数据的MIME类型")]
        public const string ContentType = "Content-Type";

        /// <summary>
        /// 上传文件
        /// </summary>
        [DisplayNameEx("上传文件", "上传文件")]
        public const string ContentDisposition = "Content-Disposition";

        /// <summary>
        /// Content-Encoding，指定已应用于伴随正文数据的编码。
        /// </summary>
        [DisplayNameEx("指定已应用于伴随正文数据的编码")]
        public const string ContentEncoding = "Content-Encoding";

        /// <summary>
        /// Content-Langauge，指定伴随正文数据的自然语言。
        /// </summary>
        [DisplayNameEx("指定伴随正文数据的自然语言")]
        public const string ContentLanguage = "Content-Langauge";

        /// <summary>
        /// Content-Location，指定可从其中获得伴随正文的URI。
        /// </summary>
        [DisplayNameEx("指定可从其中获得伴随正文的URI")]
        public const string ContentLocation = "Content-Location";

        /// <summary>
        /// Content-MD5，指定伴随正文数据的MD5摘要，用于提供端到端消息完整性检查。
        /// </summary>
        [DisplayNameEx("指定伴随正文数据的MD5摘要，用于提供端到端消息完整性检查")]
        public const string ContentMd5 = "Content-MD5";

        /// <summary>
        /// Content-Range，指定在完整正文中应用伴随部分正文数据的位置。
        /// </summary>
        [DisplayNameEx("指定在完整正文中应用伴随部分正文数据的位置")]
        public const string ContentRange = "Content-Range";

        /// <summary>
        /// Expires，指定日期和时间，在此之后伴随的正文数据应视为陈旧的。
        /// </summary>
        [DisplayNameEx("指定日期和时间，在此之后伴随的正文数据应视为陈旧的")]
        public const string Expires = "Expires";

        /// <summary>
        /// Last-Modified，指定上次修改伴随的正文数据的日期和时间。
        /// </summary>
        [DisplayNameEx("指定上次修改伴随的正文数据的日期和时间")]
        public const string LastModified = "Last-Modified";

        /// <summary>
        /// Accept，指定响应可接受的MIME类型。
        /// </summary>
        [DisplayNameEx("指定响应可接受的MIME类型")]
        public const string Accept = "Accept";

        /// <summary>
        /// Accept-Charset，指定响应可接受的字符集。
        /// </summary>
        [DisplayNameEx("指定响应可接受的字符集")]
        public const string AcceptCharset = "Accept-Charset";

        /// <summary>
        /// Accept-Encoding，指定响应可接受的内容编码。即压缩算法
        /// </summary>
        [DisplayNameEx("指定响应可接受的内容编码")]
        public const string AcceptEncoding = "Accept-Encoding";

        /// <summary>
        /// Accept-Langauge，指定响应首选的自然语言。
        /// </summary>
        [DisplayNameEx("指定响应首选的自然语言")]
        public const string AcceptLanguage = "Accept-Langauge";

        /// <summary>
        /// Authorization，指定客户端为向服务器验证自身身份而出示的凭据。
        /// </summary>
        [DisplayNameEx("指定客户端为向服务器验证自身身份而出示的凭据")]
        public const string Authorization = "Authorization";

        /// <summary>
        /// Cookie，指定向服务器提供的Cookie数据。
        /// </summary>
        [DisplayNameEx("指定向服务器提供的Cookie数据")]
        public const string Cookie = "Cookie";

        /// <summary>
        /// Expect，指定客户端要求的特定服务器行为。
        /// </summary>
        [DisplayNameEx("指定客户端要求的特定服务器行为")]
        public const string Expect = "Expect";

        /// <summary>
        /// From，指定控制请求用户代理的用户的Internet电子邮件地址。
        /// </summary>
        [DisplayNameEx("指定控制请求用户代理的用户的Internet电子邮件地址")]
        public const string From = "From";

        /// <summary>
        /// Host，指定所请求资源的主机名和端口号。
        /// </summary>
        [DisplayNameEx("指定所请求资源的主机名和端口号")]
        public const string Host = "Host";

        /// <summary>
        /// If-Match，指定仅当客户端的指示资源的缓存副本是最新的时，才执行请求的操作。
        /// </summary>
        [DisplayNameEx("指定仅当客户端的指示资源的缓存副本是最新的时，才执行请求的操作")]
        public const string IfMatch = "If-Match";

        /// <summary>
        /// If-Modified-Since，指定仅当自指示的数据和时间之后修改了请求的资源时，才执行请求的操作。
        /// </summary>
        [DisplayNameEx("指定仅当自指示的数据和时间之后修改了请求的资源时，才执行请求的操作")]
        public const string IfModifiedSince = "If-Modified-Since";

        /// <summary>
        /// If-None-Match，指定仅当客户端的指示资源的缓存副本都不是最新的时，才执行请求的操作。
        /// </summary>
        [DisplayNameEx("指定仅当客户端的指示资源的缓存副本都不是最新的时，才执行请求的操作")]
        public const string IfNoneMatch = "If-None-Match";

        /// <summary>
        /// If-Range，指定如果客户端的缓存副本是最新的，仅发送指定范围的请求资源。
        /// </summary>
        [DisplayNameEx("指定如果客户端的缓存副本是最新的，仅发送指定范围的请求资源")]
        public const string IfRange = "If-Range";

        /// <summary>
        /// If-Unmodified-Since，指定仅当自指示的日期和时间之后修改了请求的资源时，才执行请求的操作。
        /// </summary>
        [DisplayNameEx("指定仅当自指示的日期和时间之后修改了请求的资源时，才执行请求的操作")]
        public const string IfUnmodifiedSince = "If-Unmodified-Since";

        /// <summary>
        /// Max-Forwards，指定一个整数，表示此请求还可转发的次数。
        /// </summary>
        [DisplayNameEx("指定一个整数，表示此请求还可转发的次数")]
        public const string MaxForwards = "Max-Forwards";

        /// <summary>
        /// Proxy-Authorization，指定客户端为向代理验证自身身份而出示的凭据。
        /// </summary>
        [DisplayNameEx("指定客户端为向代理验证自身身份而出示的凭据")]
        public const string ProxyAuthorization = "Proxy-Authorization";

        /// <summary>
        /// Referer，指定从中获得请求URI的资源的URI。
        /// </summary>
        [DisplayNameEx("指定从中获得请求URI的资源的URI")]
        public const string Referer = "Referer";

        /// <summary>
        /// Range，指定代替整个响应返回的客户端请求的响应的子范围。
        /// </summary>
        [DisplayNameEx("指定代替整个响应返回的客户端请求的响应的子范围")]
        public const string Range = "Range";

        /// <summary>
        /// TE，指定响应可接受的传输编码方式。
        /// </summary>
        [DisplayNameEx("指定响应可接受的传输编码方式")]
        public const string Te = "TE";

        /// <summary>
        /// Translate，与WebDAV功能一起使用的HTTP规范的Microsoft扩展。
        /// </summary>
        [DisplayNameEx("与WebDAV功能一起使用的HTTP规范的Microsoft扩展")]
        public const string Translate = "Translate";

        /// <summary>
        /// User-Agent，指定有关客户端代理的信息。
        /// </summary>
        [DisplayNameEx("指定有关客户端代理的信息")]
        public const string UserAgent = "User-Agent";

        /// <summary>
        /// Upgrade-Insecure-Requests
        /// </summary>
        [DisplayNameEx("指定有关客户端代理的信息")]
        public const string UPGRADE_INSECURE_REQUEST = "Upgrade-Insecure-Requests";// Upgrade-Insecure-Requests: 1


        /// <summary>
        /// 用于通知服务器在真正的请求中会采用哪种  HTTP 方法。因为预检请求所使用的方法总是 OPTIONS ，与实际请求所使用的方法不一样，所以这个请求头是必要的
        /// </summary>
        [DisplayNameEx("用于通知服务器在真正的请求中会采用哪种  HTTP 方法。因为预检请求所使用的方法总是 OPTIONS ，与实际请求所使用的方法不一样，所以这个请求头是必要的")]
        public const string AccessControlRequestHeaders = "Access-Control-Request-Headers";

        /// <summary>
        /// User-Agent，指定有关客户端代理的信息。
        /// </summary>
        [DisplayNameEx("指定有关客户端代理的信息")]
        public const string AccessControlRequestMethod = "Access-Control-Request-Method";
    }
}
